/****************************************************************************
                Университет:    Санкт-Петербургский Политехнический Университет
                Кафедра:        Компьютерные системы и программные технологии
                Аспирант:       Быков Илья Иванович
                Программа:      Расчет коэффициентов распределения
                Модуль:         node.h
                Назначение:
****************************************************************************/

#ifndef NODE_H
#define NODE_H

#include <QGraphicsItem>
#include <QList>

class Edge;
class QGraphicsSceneMouseEvent;

class Node : public QGraphicsItem
{
public:

    enum Mode
    {
        Relax,
        Resize,
        Move
    };

    explicit Node(QColor color = Qt::red, qreal radius = 30.0);

    void addEdge(Edge *edge);
    void removeEdge(Edge *edge);

    // Все ветви узла
    QList<Edge*> edges() const;

    // Входящие
    QList<Edge*> inEdges() const;

    // Выходящие
    QList<Edge*> outEdges() const;

    enum { Type = UserType + 1 };
    int type() const { return Type; }

    QRectF boundingRect() const; // Прямоугольник в который вписан узел
    QRectF boundingVoltageRect() const;
    QPainterPath shape() const; // Контур узла

    // Отрисовка
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

    // Цвет
    void setColor(const QColor &color); 
    const QColor& color() const;
    
    // Радиус
    void setRadius(qreal radius);
    qreal radius() const;

    // Установка номера
    void setNumber(int number);
    int number() const;

    // Напряжение
    void setVoltage(double u);
    void getVoltage(double &u);

    // Мощность
    void setPower(double actiwe_p, double reactiwe_p);
    void getPower(double &actiwe_p, double &reactiwe_p);

    void setMaxMinActivePower(double max_Pa, double min_Pa);
    void getMaxMinActivePower(double &max_Pa, double &min_Pa);

    // Статус (включен\отключен)
    void setstate(int state);
    int getstate();

    Mode mode() const;

    bool linkedWith(Node *node) const;

    // Сделать подсветку
    void setHighlighted(bool b);
    bool highlighted() const;

    static bool lessThan(Node *n1, Node *n2);

    // Перерисовка
    void redraw();

protected:
    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
    void adjustEdges(); // Обновить положение стрелок

    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    
private:
    Mode m_mode;

    QList<Edge*> m_edgeList;
    QColor m_color;
    qreal m_radius;
    int m_number;
    QRectF m_rect;
    QRectF m_resizeRect;
    qreal m_tmpRadius;
    bool m_highlighted;

    double m_voltage;
    double m_active_power;
    double m_reactive_power;

    double m_max_Pa;
    double m_min_Pa;

    int    m_state;
};

#endif //NODE_H
